
#include "Link.h"



void linInit(Link* p_link)
{
	posSetX(&p_link->position, 15);
    posSetY(&p_link->position, 15);
    p_link->direction = bas;
    p_link->etat = normal;
    p_link->coeurs=10;
    p_link->vies=2;
}



/* la position d'arrivée doit être accessible */
void linTeleporte(Link* p_link, int x, int y)
{
	posSetX(&p_link->position, x);
    posSetY(&p_link->position, y);
}

void linTourne(Link* p_link, Direction dir)
{
    p_link->direction = dir;
}


void linDeplace(Link* p_link, Direction dir)
{
    switch(dir)
    {
    case haut :
        posAugmenteY(&p_link->position, -1);
        break;
    case bas :
        posAugmenteY(&p_link->position, +1);
        break;
    case gauche :
        posAugmenteX(&p_link->position, -1);
        break;
    case droite :
        posAugmenteX(&p_link->position, +1);
        break;
    }
}



int linGetPosX(const Link* p_link)
{
    return posGetX(&p_link->position);
}

int linGetPosY(const Link* p_link)
{
    return posGetY(&p_link->position);
}

const Position* linGetConstPosition(const Link* p_link)
{
    return &p_link->position;
}



const Direction linGetDirection(const Link* p_link)
{
    return p_link->direction;
}


/* 3 lignes car trois cases touchées */
void linAttaqueEpee(Link* p_link, Position tab_de_positions_touchees[3])
{
    /* petit schéma pour comprendre : la flèche indique l'orientation de Link au moment où il attaque, les "x" les positions touchées
    haut :      bas :        gauche :       droite :
        xxx                    x                 x
         ^        v            x<               >x
                 xxx           x                 x
    */

    int x, y;

    x = posGetX(&p_link->position);
    y = posGetY(&p_link->position);

    switch(p_link->direction)
    {
        case haut :
            posSetX(&tab_de_positions_touchees[0], x - 1);
            posSetY(&tab_de_positions_touchees[0], y - 1);

            posSetX(&tab_de_positions_touchees[1], x    );
            posSetY(&tab_de_positions_touchees[1], y - 1);

            posSetX(&tab_de_positions_touchees[2], x + 1);
            posSetY(&tab_de_positions_touchees[2], y - 1);
            break;

        case bas :
            posSetX(&tab_de_positions_touchees[0], x - 1);
            posSetY(&tab_de_positions_touchees[0], y + 1);

            posSetX(&tab_de_positions_touchees[1], x    );
            posSetY(&tab_de_positions_touchees[1], y + 1);

            posSetX(&tab_de_positions_touchees[2], x + 1);
            posSetY(&tab_de_positions_touchees[2], y + 1);
            break;

        case gauche :
            posSetX(&tab_de_positions_touchees[0], x - 1);
            posSetY(&tab_de_positions_touchees[0], y - 1);

            posSetX(&tab_de_positions_touchees[1], x - 1);
            posSetY(&tab_de_positions_touchees[1], y    );

            posSetX(&tab_de_positions_touchees[2], x - 1);
            posSetY(&tab_de_positions_touchees[2], y + 1);
            break;

        case droite :
            posSetX(&tab_de_positions_touchees[0], x + 1);
            posSetY(&tab_de_positions_touchees[0], y - 1);

            posSetX(&tab_de_positions_touchees[1], x + 1);
            posSetY(&tab_de_positions_touchees[1], y    );

            posSetX(&tab_de_positions_touchees[2], x + 1);
            posSetY(&tab_de_positions_touchees[2], y + 1);
            break;
    }
}





int linGetNbCoeurs(const Link* p_link)
{
    return (p_link->coeurs);
}

void linChangeNbCoeurs(Link* p_link, int modificateur)
{
    p_link->coeurs = p_link->coeurs + modificateur;

    /* on vérifie qu'il n'est pas mort au passage, si c'est le cas, il perd 1 vie et on remet ses coeurs à 10 */
    if (p_link->coeurs <= 0)
    {
        linChangeNbVies(p_link, -1);
        p_link->coeurs = 10;
    }
}



int linGetNbVies(const Link* p_link)
{
    return (p_link->vies);


}

void linChangeNbVies(Link* p_link, int modificateur)
{
    p_link->vies = p_link->vies + modificateur;

    if (p_link->vies <= 0)
    {
		/*...*/
    }
}



const EtatL linGetEtat(const Link* p_link)
{
    return (p_link->etat);
}

void linSetEtat(Link* p_link, EtatL nouvel_etat)
{
    p_link->etat = nouvel_etat;
}


